package com.rt.gptnext.common.utils;

import java.util.function.Supplier;

/**
 * 安全调用类，如从对象中获取一个属性，但是这个对象可能引起空指针异常时，同时这个返回值也不是特别重要的情况下，可以使用此工具类
 *
 * @author gaoyiyang
 **/
public class SafeUtil {

    /**
     * 安全获取参数
     *
     * @param getter               获取器
     * @param defaultValueSupplier 默认值提供器
     * @return -
     */
    public static <T> T call(Getter<T> getter, Supplier<T> defaultValueSupplier) {
        try {
            return getter.get();
        } catch (Throwable ignore) {
        }
        if (defaultValueSupplier == null) {
            return null;
        }
        return defaultValueSupplier.get();
    }


    /**
     * 安全获取参数
     *
     * @param getter       获取器
     * @param defaultValue 默认值
     * @return -
     */
    public static <T> T call(Getter<T> getter, T defaultValue) {
        return call(getter, (Supplier<T>) () -> defaultValue);
    }

    /**
     * 安全获取参数
     *
     * @param getter 获取器
     * @return -
     */
    public static <T> T call(Getter<T> getter) {
        return call(getter, (Supplier<T>) null);
    }

    /**
     * 安全执行方法
     *
     * @param execute 忽略该函数中的所有异常
     */
    public static void call(Execute execute) {
        if (execute == null) {
            return;
        }
        try {
            execute.call();
        } catch (Exception ignore) {
        }
    }

    @FunctionalInterface
    public interface Execute {
        void call() throws Exception;
    }

    @FunctionalInterface
    public interface Getter<T> {
        /**
         * 获取提供的对象
         *
         * @return -
         * @throws Exception 抛出所有异常
         */
        T get() throws Exception;
    }

}
